package com.itheima.aop;

import com.itheima.mapper.EmpLoginLogMapper;
import com.itheima.pojo.Emp;
import com.itheima.pojo.EmpLoginLog;
import com.itheima.pojo.LoginInfo;
import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

// 员工登录的切面类
@Slf4j
@Component
@Aspect
public class EmpLoginAspect {
    @Autowired
    private EmpLoginLogMapper empLoginLogMapper;

    // 1.切入点表达式
    @Around("execution(* com.itheima.controller.LoginController.*(..))")
    // 2.通知代码
    public Object recordEmpLogin(ProceedingJoinPoint pjp) throws Throwable {
        Object[] args = pjp.getArgs();

        String username = "";
        String password = "";
        if (args.length == 1 && args[0] instanceof Emp) {
            Emp emp = (Emp) args[0];
            // 用户名 （登录时，输入的用户名） ----- 【提示：用户名在原始方法执行时的参数中 -- 可以强转】
            username = emp.getUsername();
            // 密码 （登录时，输入的密码） -------- 【提示：密码在原始方法执行时的参数中 】
            password = emp.getPassword();
        }

        // 操作时间 （什么时间，员工登录的）
        LocalDateTime loginTime = LocalDateTime.now();

        long begin = System.currentTimeMillis();
        // 登录是否成功 ------ 【提示：在原始方法执行后的返回值中，可以通过Result来获取code从而判断成功还是失败 -- 可以强转】
        Result ret = (Result) pjp.proceed();
        long end = System.currentTimeMillis();
        //                  Integer -> int -> short -> Short
        Short isSuccess = (short)ret.getCode().intValue();

        // 登录成功后，下发的jwt令牌 ------ 【提示：jwt在原始方法执行后的返回值中 -- 可以强转】
        Object data = ret.getData();
        String jwt = "";
        if (data != null && data instanceof LoginInfo) {
            LoginInfo loginInfo = (LoginInfo) data;
            jwt = loginInfo.getToken();
        }

        // 登录操作耗时
        long costTime = end - begin;

        EmpLoginLog empLoginLog = new EmpLoginLog(null, username, password, loginTime, isSuccess, jwt, costTime);
        // 添加到数据库表中
        empLoginLogMapper.insertEmpLoginLog(empLoginLog);

        return ret;
    }
}
